package cn.tedu.block;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-10 周四 20:08
 */
/*本类用于测试代码块之间的关系*/
public class TestBlock {
    public static void main(String[] args) {
        /*1.创建对象之前会自动执行静态代码块，且静态代码块只执行依次，不管程序运行了几次*/
        /*2.每次创建对象时，都会调用构造代码块和构造方法，构造代码块先执行*/
        Person p1=new Person();
        p1.sleep();
        Person p2=new Person();
        /*3.对象调用方法时，如果方法里有局部代码块，局部代码块才会执行*/
        p2.sleep();

    }
}
class Person{
    /*静态代码块：
    * 位置 类里方法外 格式 static{}
    * 执行时机：静态代码块也是静态资源，随着类的加载而加载，优先于对象加载
    * 作用：用于专门加载一些需要第一时间加载的功能
    * */
    static {
        System.out.println("Static Code Block");
    }
    /*构造代码块：
    * 位置：类里方法外
    * 触发时机：创建对象时触发，优先于构造方法执行
    * 作用：用于提取所有构造方法的共性功能*/
    {
        System.out.println("Construct Code Block");
    }

    /*构造方法是没有返回值类型且与类同名的方法，用于创建对象，在创建对象时触发*/
    public Person() {
        System.out.println("Constructor ");
    }

    public void sleep(){
        /*局部代码块：
        * 位置：方法里
        * 执行时机：调用本方法时触发
        * 作用：控制变量作用范围，作用范围越小越好*/
        {
            System.out.println("局部代码块");
        }
    }
}
